package com.sunyifeng.ch05;

import com.sunyifeng.ch04.Dish;

import java.util.Arrays;
import java.util.List;

import static com.sunyifeng.ch04.Dish.menu;
import static java.util.stream.Collectors.toList;

/**
 * 5.1 筛选和切片
 * filter()/distinct()/limit()/skip()
 * */
public class Filtering{

    public static void main(String...args){
        // 5.1.1 用谓词筛选(filter)
        List<Dish> vegetarianMenu =
            menu.stream()
                .filter(Dish::isVegetarian)
                .collect(toList());
        System.out.println("-----------用谓词筛选(filter) begin-----------");
        vegetarianMenu.forEach(System.out::println);
        System.out.println("-----------用谓词筛选(filter) end-----------");

        // 5.1.2 筛选各异（去重distinct）的元素
        System.out.println("-----------筛选各异（去重distinct）的元素 begin-----------");
        List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
        numbers.stream()
               .filter(i -> i % 2 == 0)
               .distinct()
               .forEach(System.out::println);
        System.out.println("-----------筛选各异（去重distinct）的元素 end--------------");

        // 5.1.3 截短流（limit）300卡的头两道菜
        List<Dish> dishesLimit3 =
            menu.stream()
                .filter(d -> d.getCalories() > 300)
                .limit(3)
                .collect(toList());
        System.out.println("-----------截短流（limit） begin-----------");
        dishesLimit3.forEach(System.out::println);
        System.out.println("-----------截短流（limit） end--------------");

        // 5.1.4 跳过（skip）300卡的头两道菜，注意limit和skip是互补（相反）
        List<Dish> dishesSkip2 =
            menu.stream()
                .filter(d -> d.getCalories() > 300)
                .skip(2)
                .collect(toList());
        System.out.println("-----------跳过（skip） begin-----------");
        dishesSkip2.forEach(System.out::println);
        System.out.println("-----------跳过（skip） end--------------");
    }
}
